前言

本文对Android NDK开发进行较详细的梳理,特别是针对其中涉及到的坑进行重点阐述,以让大家在后续的开发中重复踩坑。

CMake

待续

ndk-build

待续

工程实施

待续

构建

构建命令

  1. 打开Android studio的内嵌终端;

  2. 在项目根目录下,执行形如gradlew.bat [module_name]:externalNativeBuild[buildTypesName]的命令,比如:

    gradlew.bat ndkbuild:externalNativeBuildRelease

    其中,module_name为你的工程模块(module)名称,如果是app模块,这里则取“app”。buildTypesName是该模块的build.gradle配置里面的buildTypes(构建类型)中的其中一种,比如release或者你自己配置的名字。下面代码片段是截取自示例模块ndkbuild的build.gradle示例:

    android {
     compileSdkVersion 26
    
     lintOptions {
         disable 'OldTargetApi','UnusedResources'
     }
    
     defaultConfig {
         minSdkVersion 15
         targetSdkVersion 26
         versionCode 1
         versionName "1.0"
    
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
         externalNativeBuild {
             ndkBuild {
                 //arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk"
                 //cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2"
                 //cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2"
                 abiFilters "armeabi-v7a"
             }
         }
    
     }
    
     buildTypes {
         release {
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
    
     externalNativeBuild {
         ndkBuild {
             path 'src/main/jni/projects/android/jni/Android.mk'
         }
     }
    }
    
  3. 构建命令执行完成之后,如果是采用ndk-build构建,在%module_path%/build/intermediates/ndkBuild,如果是采用cmake构建,则%module_path%/build/intermediates/cmake下可查看构建的结果。其中%module_path%代表module的全路径。则是示例如下图:

  4. 从步骤3中查看构建出来的so往往比正常情况下大很多,这里原因暂未找到!!!不过可以在目录%module_path%/build/outputs/aar下面找到aar(前提是这里的module是android library module而非app module),用压缩软件打开,提取出压缩包中的jni子目录下的so,这里的so大小正常。

clean命令

想要清除上一次构建的结果,类似于构建命令,可按照如下步骤操作:

  1. 打开Android studio的内嵌终端;

  2. 分两种clean模式:

    • a.只针对性清理某一构建命令生成的文件,在项目根目录下执行形如gradlew.bat [module_name]:externalNativeBuildClean[buildTypesName]的命令,比如:

      gradlew.bat ndkbuild:externalNativeBuildCleanRelease

    • b.全清除,即清楚所有生成的构建文件和目录。即%module_path%/build目录全部删除。那么应该执行形如形如gradlew.bat [module_name]:clean的命令,比如:

      gradlew.bat ndkbuild:clean

      当然也直接利用Android studio的菜单栏中的选项(Build-->Clean Project)进行clean(不过这样是清理整个project),比如:

  3. 清理完成之后,如果项目是采用ndk-build构建,在%module_path%/build/intermediates/ndkBuild,如果是采用cmake构建,则%module_path%/build/intermediates/cmake下可查看是否清理完成。如果是全清除模式,则查看%module_path%/build目录是否删除。